本文对释放 Docker 占的磁盘,网络,数据卷的命令做一个整理。内容部分来自网络,一部分来自自己的总结。
Volumn
来自 chadoe/docker-cleanup-volumes
清理所有没有打标签的 volume:
1 | $ docker volume rm $(docker volume ls -qf dangling=true) |
或:
1 | $ docker volume ls -qf dangling=true | xargs -r docker volume rm |
Networks
列出本机创建的所有 network:
1 | $ docker network ls |
1 | $ docker network ls | grep "bridge" |
1 | $ docker network rm $(docker network ls | grep "bridge" | awk '/ / { print $1 }') |
Images
来自 how-to-remove-old-and-unused-docker-images
1 | $ docker images |
1 | $ docker images | grep "none" |
Containers
来自 how-to-remove-old-and-unused-docker-images
删除所有已经退出的容器
1 | $ docker rm $(docker ps -qa --no-trunc --filter "status=exited") |
或
1 | docker rm `docker ps -a | grep -i 'exited' | awk {'print $1'}` |
内置命令
从1.13.0版本开始,docker 引入了 docker system prune
命令,可以用来清理主机的磁盘空间。该命令可以一键清理所有已停止的容器;所有未被容器引用的 volume(dangling volume);所有未被容器引用的网络;所有 dangling 的镜像。命令执行完后可以看到释放的空间的大小。
1 | docker system prune |
如果要移除所有未被使用的镜像(不仅仅是 dangling 的),可以使用
1 | docker system prune -a |
dangling 的镜像的定义是未被其他镜像引用的镜像,如果构建了新的镜像,但该镜像没有被打上一个新的标签,那么之前打了这个标签的镜像就是 dangling 镜像,它的 name 属性是 none。总的来说,如果一个镜像与任何一个打上标签的镜像没有关联,它就是 dangling 镜像。如果镜像的 repository 和 tag 都是 none,称为 intermediate 镜像。
prune 方法的实现在 https://github.com/moby/moby/blob/master/daemon/prune.go
里,有兴趣的话可以看看这个方法的实现。
清理镜像
1 | docker image prune |